package com.yang.api.filter;

import com.yang.common.model.StandardSubmit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 策略模式的上下文对象
 */
@Component
@RefreshScope //实现配置的动态刷新功能,当配置nacos配置改变，读取属性也会动态改变
public class CheckFilterContext {
    // Spring的IOC会将CheckFilter的实现类对象全部都放到Map集合中
    //key就是注入到IOC容器中的bean的名称，value就是CheckFilter的实现类对象,通过Map的get获取
    // 基于4.x中Spring提供的泛型注入，基于Map只拿到需要的类型对象即可
    @Autowired
    private Map<String,CheckFilter> checkFilterMap;

    //读取nacos中的filters配置，冒号:是防止空指针，当为空取冒号:右边的
    @Value("${filters:apikey,ip,sign,template}")
    private String filters;

    /**
     * 当前check方法用于管理校验链的顺序
     * @param
     */
    public void check(StandardSubmit submit){
        //1. 将获取到filters基于,做切分
        String[] filterArray = filters.split(",");
        //2.遍历数组
        for (String filter : filterArray) {
            //从IOC中获取对象,通过Map的get拿到
            CheckFilter checkFilter = checkFilterMap.get(filter);
            //执行校验的业务逻辑
            checkFilter.check(submit);
        }
    }
}
